package com.baidu.ueditor.hunter;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

import org.apache.commons.io.FileUtils;

import com.baidu.ueditor.PathFormat;
import com.baidu.ueditor.define.AppInfo;
import com.baidu.ueditor.define.BaseState;
import com.baidu.ueditor.define.MultiState;
import com.baidu.ueditor.define.State;

public class FileManager{

    private String dir = null;
    private String rootPath = null;
    private String[] allowFiles = null;
    private int count = 0;

    public FileManager(Map<String, Object> conf){

        this.rootPath = (String) conf.get("rootPath");
        this.dir = this.rootPath + (String) conf.get("dir");
        this.allowFiles = this.getAllowFiles(conf.get("allowFiles"));
        this.count = (Integer) conf.get("count");

    }

    public State listFile(int index){

        File dir = new File(this.dir);
        State state = null;

        if(!dir.exists()){
            return new BaseState(false, AppInfo.NOT_EXIST);
        }

        if(!dir.isDirectory()){
            return new BaseState(false, AppInfo.NOT_DIRECTORY);
        }

        Collection<File> list = FileUtils.listFiles(dir, this.allowFiles, true);

        if(index < 0 || index > list.size()){
            state = new MultiState(true);
        }else{
            Object[] fileList = Arrays.copyOfRange(list.toArray(), index, index + this.count);
            state = this.getState(fileList);
        }

        state.putInfo("start", index);
        state.putInfo("total", list.size());

        return state;

    }

    private State getState(Object[] files){

        MultiState state = new MultiState(true);
        BaseState fileState = null;

        File file = null;

        for(Object obj : files){
            if(obj == null){
                break;
            }
            file = (File) obj;
            fileState = new BaseState(true);
            fileState.putInfo("url", PathFormat.format(this.getPath(file)));
            state.addState(fileState);
        }

        return state;

    }

    private String getPath(File file){

        String path = file.getAbsolutePath();

        return path.replace(this.rootPath, "/");

    }

    private String[] getAllowFiles(Object fileExt){

        String[] exts = null;
        String ext = null;

        if(fileExt == null){
            return new String[0];
        }

        exts = (String[]) fileExt;

        for(int i = 0, len = exts.length; i < len; i++){

            ext = exts[i];
            exts[i] = ext.replace(".", "");

        }

        return exts;

    }

}
